package cn.iocoder.yudao.module.shop.service.monthmember;

import java.time.LocalDateTime;
import java.util.*;
import javax.validation.*;

import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletRechargeDO;
import cn.iocoder.yudao.module.shop.controller.admin.monthmember.vo.*;
import cn.iocoder.yudao.module.shop.dal.dataobject.monthmember.ShopMonthMemberDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.ShopOrderDO;
import cn.iocoder.yudao.module.shop.enums.store.ChargeTypeEnum;

/**
 * 顾客每月到店统计 Service 接口
 *
 * @author 曹建伟
 */
public interface ShopMonthMemberService {

    /**
     * 创建顾客每月到店统计
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createMonthMember(@Valid ShopMonthMemberCreateReqVO createReqVO);

    /**
     * 更新顾客每月到店统计
     *
     * @param updateReqVO 更新信息
     */
    void updateMonthMember(@Valid ShopMonthMemberUpdateReqVO updateReqVO);

    /**
     * 删除顾客每月到店统计
     *
     * @param id 编号
     */
    void deleteMonthMember(Long id);

    /**
     * 获得顾客每月到店统计
     *
     * @param id 编号
     * @return 顾客每月到店统计
     */
    ShopMonthMemberDO getMonthMember(Long id);

    /**
     * 获得顾客每月到店统计列表
     *
     * @param ids 编号
     * @return 顾客每月到店统计列表
     */
    List<ShopMonthMemberDO> getMonthMemberList(Collection<Long> ids);

    /**
     * 获得顾客每月到店统计分页
     *
     * @param pageReqVO 分页查询
     * @return 顾客每月到店统计分页
     */
    PageResult<ShopMonthMemberDO> getMonthMemberPage(ShopMonthMemberPageReqVO pageReqVO);

    /**
     * 获得顾客每月到店统计列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 顾客每月到店统计列表
     */
    List<ShopMonthMemberDO> getMonthMemberList(ShopMonthMemberExportReqVO exportReqVO);

    Boolean recordOrder(ShopOrderDO order, Boolean isNewMember, Long rechargeOrderCount);

    Boolean rollbackOrder(ShopOrderDO order);

    Boolean recordPayOrder(PayWalletRechargeDO payOrder, Long masterId, ChargeTypeEnum chargeType);

    Boolean recordTimesChargePay(Integer payPrice, Long memberId, Long masterId, ChargeTypeEnum chargeType, Long tenantId);

    List<ShopMonthMemberDO> getMonthMemberListByTime(LocalDateTime startTime, LocalDateTime endTime, Long tenantId);

}
